#include "timer.h"
#include "stdbool.h"

/*使用说明：仅仅需要#include "timer.h"
后台部分：
TIM6初始化好 1MS中断一次
HAL_TIM_Base_Start_IT(&htim6);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM6) {
    timer_isr();
  }
}

前台部分：
uint8_t hdcpTimerHandle = 0xFF;
uint8_t dnsTimerHandle = 0xFF;
time_type T1,T2;

void DHCP_time_handler(void){printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);}
void DNS_time_handler(void){printf("\r\n\r\n\r\n%s\r\n\r\n\r\n",__FUNCTION__);}
hdcpTimerHandle = timer.creat(&T1,100 , 1 , DHCP_time_handler); 我现在是1MS中断一次 100就是100MS调用一次
dnsTimerHandle  = timer.creat(&T2,100 , 1 , DNS_time_handler);即可
我现在的风格比较扯淡 你看T1 T2从此再也没有出现过来 它到链表里面去了
陈强的就是不需要这个参数的 因为我是自带内存 没办法！
并且必须这样 V2.0的有重大BUG 必须传入&才可以！
dnsTimerHandle = timer.creat(1000 , FALSE , DNS_time_handler);
就可以自己做回调函数了

timer.stop(dnsTimerHandle);
timer.start(dnsTimerHandle);

*/

static uint8_t	  StimerTaskId = 0;   //表示每个节点的标号 此后可以对外释放 方便开 和 关
static time_type *Stimerhead = NULL;  //链表的头结点


//遍历链表 周期loop执行
void timer_isr( void )
{
	time_type 	 *priv = Stimerhead;

	while( priv != NULL )
    {
        if( priv->start)
        {
            if( ++priv->cnt >= priv->time_out)
            {
                priv->cnt = 0;
                if(priv->fun != NULL)	priv->fun();
            }
        }
        priv = priv->next;      
	  }
}


//关闭节点 《并没有链表移除 而是用标记位 优点：方便简单 缺点：内存无法释放》
uint8_t timer_stop_time(uint8_t handle)
{
	time_type *priv = Stimerhead;
	
	while( priv != NULL )
    {
        if( priv->handle == handle)
        {
            priv->start = false;
            return true;
        }
        priv = priv->next;     
	}  
    
    return false;
}
//开启节点 
uint8_t timer_start_time(uint8_t handle)
{
	time_type *priv = Stimerhead;
	
	while( priv != NULL )
    {
        if( priv->handle == handle)
        {
            priv->start = true;
            priv->cnt = 0;
            return true;
        }
        priv = priv->next;     
	}  
    
    return false;
}

//一个节点添加到链表 返回它的ID
uint8_t timer_register_isr( time_type* timenode, uint32_t time_out ,uint8_t start, time_call_back call_back)
{
	time_type *priv;
	time_type *this;

	this = timenode;//可以思考陈强用malloc实现  目前这里和button一样我是自带内存
	
	this->cnt = 0;//实际计数值
	this->start = start;//开关
	this->handle = StimerTaskId++;//统一在链表中的ID
	this->time_out = time_out;//超时计数值
	this->fun = call_back;//节点逻辑函数
	this->next = NULL;//节点后继
	if( Stimerhead == NULL)
	{
		Stimerhead = this;//第一次 实例化head
	}
	else
	{
		priv = Stimerhead;
		while( priv->next != NULL )	priv = priv->next;//第一次以后：尾插
		priv->next = this;
	}    

	printf("Stimerhead->handle=%d\n",this->handle);
	return (this->handle);
}


time_ops_type   timer =
{
    .creat = timer_register_isr,
    .stop  = timer_stop_time , 
    .start = timer_start_time,
};

